package com.yh.utils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

/**
 * 改造搜索结果的类型（可以对多个任意类型的实体类进行改造）
 *
 * @author yuhuan
 * @date 2022/01/13
 */
public class TransformSearchResult {

    /**
     * 从任意对象中抽取字符串类型的属性的值并添加到默认的集合中，默认集合中一定包括一个用来查询所有的关键字
     * 如：["全部", "爱情", "喜剧", "动画", "剧情", "惊悚", "科幻", "动作", "悬疑", "犯罪", "传记"]
     */
    public static <T> List<String> siphonIntoDefault(Function<T, String> function, Collection<T>... searchResult) {
        // 储存抽取结果的默认集合
        List<String> stringList = new ArrayList<>();
        stringList.add(Constants.MovieData.OFF_KEY_WORD);
        // 将抽取结果添加到默认集合
        List<String> siphonList = siphon(function, searchResult);
        stringList.addAll(siphonList);
        return stringList;
    }

    /**
     * 从多个任意对象中抽取对象的某个属性值并收集到一个统一的集合中返回
     *
     * @function 提取属性的具体规则（提取哪个属性完全由使用者决定）
     * 如：m -> m.getTypeName()
     * @searchResult 需要提取属性的对象集
     */
    public static <T, R> List<R> siphon(Function<T, R> function, Collection<T>... searchResult) {
        // 储存最终的抽取结果
        List<R> applyList = new ArrayList<>();
        for (Collection<T> collection : searchResult) {
            for (T element : collection) {
                // 从元素中提取属性值并存放到结果集
                R apply = function.apply(element);
                applyList.add(apply);
            }
        }
        return applyList;
    }
}
